@JsonSubTypes Jackson এর একটি শক্তিশালী অ্যানোটেশন, যা Polymorphic Deserialization-এ সাহায্য করে। এটি মূলত একটি parent class এবং তার subclasses এর মধ্যে সম্পর্ক নির্ধারণ করতে ব্যবহৃত হয়। যখন একটি superclass থেকে subclasses এ ডেটা ম্যাপ করতে হয়, তখন @JsonSubTypes ব্যবহার করে subclasses এর dynamic type handling করা যায়।
Polymorphic Deserialization
Polymorphic Deserialization হল এমন একটি প্রক্রিয়া যেখানে একটি সাধারণ (parent) ক্লাসের ইনস্ট্যান্স JSON ফরম্যাটে উপস্থিত থাকে এবং তা থেকে সঠিক subclass তৈরি করা হয়।
Jackson @JsonSubTypes এবং @JsonTypeInfo অ্যানোটেশনগুলির সাহায্যে polymorphic deserialization সক্ষম করে, যেখানে superclass JSON ডেটা থেকে তার subtype খুঁজে বের করে এবং সেই অনুযায়ী subclass-এর ইনস্ট্যান্স তৈরি করে।
@JsonSubTypes এর মূল বৈশিষ্ট্য
- Dynamic Type Identification: Jackson parent class থেকে সঠিক subclass ডেসিরিয়ালাইজ করতে পারে।
- Type Information:
@JsonTypeInfoএর মাধ্যমে টাইপ ইনফরমেশন দেওয়া হয়, যাতে Jackson সঠিক subclass নির্বাচন করতে পারে। - Subtypes Configuration:
@JsonSubTypesব্যবহার করে আপনি subclass গুলো নির্দিষ্ট করতে পারেন।
@JsonSubTypes এর ব্যবহার
Step-by-Step উদাহরণ:
- Superclass তৈরি করা (Parent Class):
- প্রথমে একটি superclass (Parent Class) তৈরি করুন।
- Subclass তৈরি করা:
- এরপর এই superclass থেকে একাধিক subclass তৈরি করুন।
@JsonTypeInfoএবং@JsonSubTypesব্যবহার করা:@JsonTypeInfoparent class-এ ব্যবহার করা হবে, যা ডেটাতে টাইপ ইনফরমেশন রাখে।@JsonSubTypesব্যবহার করে subclass গুলো নির্ধারণ করা হবে।
১. Superclass এবং Subclasses তৈরি করা
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "dog"),
@JsonSubTypes.Type(value = Cat.class, name = "cat")
})
public abstract class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void makeSound();
}
class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println("Bark");
}
}
class Cat extends Animal {
public Cat(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println("Meow");
}
}
২. JSON Serialization (Superclass এর Object এর JSON রূপান্তর)
import com.fasterxml.jackson.databind.ObjectMapper;
public class PolymorphicSerializationExample {
public static void main(String[] args) throws Exception {
Animal dog = new Dog("Buddy");
Animal cat = new Cat("Whiskers");
ObjectMapper mapper = new ObjectMapper();
// Serialize to JSON
String dogJson = mapper.writeValueAsString(dog);
String catJson = mapper.writeValueAsString(cat);
System.out.println("Dog JSON: " + dogJson);
System.out.println("Cat JSON: " + catJson);
}
}
Output:
Dog JSON: {"type":"dog","name":"Buddy"}
Cat JSON: {"type":"cat","name":"Whiskers"}
এখানে @JsonTypeInfo অ্যানোটেশনটি type ফিল্ডের মাধ্যমে subclass টাইপ ইনফরমেশন সরবরাহ করেছে, এবং @JsonSubTypes ডগ এবং ক্যাট subclass গুলো নির্ধারণ করেছে।
৩. JSON Deserialization (JSON থেকে Subclass Object তৈরি)
import com.fasterxml.jackson.databind.ObjectMapper;
public class PolymorphicDeserializationExample {
public static void main(String[] args) throws Exception {
String dogJson = "{\"type\":\"dog\",\"name\":\"Buddy\"}";
String catJson = "{\"type\":\"cat\",\"name\":\"Whiskers\"}";
ObjectMapper mapper = new ObjectMapper();
// Deserialize JSON back to correct subclass
Animal dog = mapper.readValue(dogJson, Animal.class);
Animal cat = mapper.readValue(catJson, Animal.class);
System.out.println("Dog Name: " + dog.getName());
dog.makeSound();
System.out.println("Cat Name: " + cat.getName());
cat.makeSound();
}
}
Output:
Dog Name: Buddy
Bark
Cat Name: Whiskers
Meow
এখানে, Jackson type প্রোপার্টির মাধ্যমে সঠিক subclass (Dog অথবা Cat) নির্বাচন করেছে এবং তারপরে সঠিক subclass-এর অবজেক্ট তৈরি করেছে।
@JsonSubTypes এর গুরুত্বপূর্ণ প্যারামিটারসমূহ
value:- এটি subclass কে সুনির্দিষ্ট করে। এখানে আমরা
Dog.classএবংCat.classপ্রদান করেছি।
- এটি subclass কে সুনির্দিষ্ট করে। এখানে আমরা
name:- এটি subclass টাইপের নাম নির্ধারণ করে। এখানে
"dog"এবং"cat"আমরা JSON ডেটার মধ্যে প্রদান করেছি।
- এটি subclass টাইপের নাম নির্ধারণ করে। এখানে
use:JsonTypeInfo.Id.NAMEব্যবহার করলে টাইপ ইনফরমেশন হিসেবে subclass নাম প্রেরণ হয়।- অন্য একটি ব্যবহার হতে পারে
JsonTypeInfo.Id.CLASS, যেখানে ক্লাসের সম্পূর্ণ নাম ব্যবহৃত হয়।
@JsonTypeInfo এবং @JsonSubTypes এর অতিরিক্ত কনফিগারেশন
Polymorphic Type Handling with Class Names
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "com.example.Dog"),
@JsonSubTypes.Type(value = Cat.class, name = "com.example.Cat")
})
public abstract class Animal { ... }
এখানে, @JsonTypeInfo.Id.CLASS ব্যবহারের মাধ্যমে Jackson পুরো ক্লাসের নাম (যেমন: "com.example.Dog") ব্যবহার করবে subclass সনাক্ত করতে।
Polymorphic Deserialization using @JsonSubTypes with Constructor
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "dog"),
@JsonSubTypes.Type(value = Cat.class, name = "cat")
})
public abstract class Animal {
private String name;
// Constructor, Getters, and Setters
@JsonCreator
public Animal(@JsonProperty("name") String name) {
this.name = name;
}
}
এখানে, @JsonCreator এবং @JsonProperty ব্যবহার করে কাস্টম কনস্ট্রাকটর দিয়ে ডেসিরিয়ালাইজেশন করা যেতে পারে।
- Polymorphic Deserialization সহজে Jackson দিয়ে
@JsonTypeInfoএবং@JsonSubTypesব্যবহার করে করা সম্ভব। @JsonSubTypesআপনাকে JSON ফাইলের বিভিন্ন subclass টাইপ অনুযায়ী সঠিক Java ক্লাসে ডেটা ম্যাপ করতে সাহায্য করে।- Type Information এবং Subtypes Configuration এর মাধ্যমে আপনি বিভিন্ন subclass ইনস্ট্যান্স তৈরি করতে পারেন, যা বিশেষত polymorphic ডেটা মডেল এবং API-তে খুবই উপকারী।
Read more